home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 1999 August / SGI Freeware 1999 August.iso / dist / fw_gnats.idb / usr / freeware / lib / gnats / contrib / delete-pr / delete-pr.sh.z / delete-pr.sh
Encoding:
Linux/UNIX/POSIX Shell Script  |  1999-04-16  |  4.5 KB  |  217 lines

  1. #!/bin/sh
  2. # Program to delete problem reports for GNATS.
  3. # Contributed by Kevin Hopkins (K.Hopkins@cs.nott.ac.uk).
  4.  
  5. MAIL_AGENT=/bin/mail
  6. GNATS_ROOT=@GNATS_ROOT@
  7. LIBDIR=@LIBDIR@
  8. PATH=$PATH:$GNATS_ROOT/gnats-bin
  9. PR_EDIT=$LIBDIR/gnats/pr-edit
  10. INDEX=$GNATS_ROOT/gnats-adm/index
  11. GNATS_USER="gnats"
  12. locked=
  13. closed=
  14. closed_state=
  15. force=
  16.  
  17. usage="Usage: $0 [-fhV] [--version] [--help] [--force] PR | [-c|--closed]"
  18. version=@VERSION@
  19.  
  20. # check to see if there is a $EDITOR; if not, use vi
  21. [ -z "$EDITOR" ] && EDITOR=vi
  22.  
  23. # parse command line.
  24. # for the non-flag argument, assume it's correct.  if it's a full
  25. # id number, use that; if not, find the full id.
  26. # only continue if $full_id is an actual file.
  27.  
  28. if [ $# -eq 0 ]; then
  29.   echo $usage ; exit 1
  30. fi
  31. case "$1" in
  32.   -V|-v|--version|--ve*)
  33.     echo "$version"; exit 0
  34.     ;;
  35.   -h|--help*)
  36.     echo "$usage"; exit 0
  37.     ;;
  38.   -c|--closed)
  39.     if [ "$#" -eq "1" ] ; then
  40.       closed=t
  41.     else
  42.       echo "$usage"; exit 0
  43.     fi
  44.     ;;
  45.   -f|--force)
  46.     force=t
  47.     ;;
  48.   -*)
  49.     echo "$usage"; exit 1
  50.     ;;
  51.   *)
  52.     if [ "`echo $1 | grep /`" != "" ]; then
  53.       full_id=$1
  54.     else
  55.       full_id=`grep "/$1:" $INDEX | awk -F: '{print $1}' -`
  56.     fi
  57.     ;;
  58. esac
  59.  
  60. if [ "$closed" = "t" ]
  61. then    looper=`awk -F: '$4 == "closed" { print $1 }' $INDEX`
  62. else    looper=$full_id
  63. fi
  64.  
  65. if [ "`echo -n`" = "-n" ]
  66. then    echon () { echo $* \\c ; }
  67. else    echon () { echo -n $* ; }
  68. fi
  69.  
  70. # start of loop
  71. for full_id in $looper
  72. do
  73.  
  74.  
  75.  
  76. trap 'rm -f /tmp/user$$ $INDEX.$$; exit 0' 0
  77. trap 'if [ "$locked" != "" ]; then \
  78.         $PR_EDIT --unlock $full_id ; \
  79.     locked= ; \
  80.       fi ; \
  81.       rm -f /tmp/user$$ $INDEX.$$; exit 1' 1 2 3 13 15
  82.  
  83. # check $full_id
  84. pr=$GNATS_ROOT/$full_id    # pr = full path of editee
  85.  
  86. if [ "$full_id" = "" ]; then
  87.   echo "edit-pr: file not found" ; echo $usage ; exit 1
  88. else
  89.   if [ ! -f $pr -o ! -r $pr ]; then
  90.     echo "edit-pr: cannot read PR $full_id"
  91.     echo $usage ; exit 1
  92.   fi
  93. fi
  94.  
  95. # find a user name
  96. if [ "$USER" != "" ]; then
  97.   me=$USER
  98. else
  99.   if [ "$LOGNAME" != "" ]; then
  100.     me=$LOGNAME
  101.   else
  102.     echo "edit-pr: no user name found---set LOGNAME." ; exit 1
  103.   fi
  104. fi
  105.  
  106. if [ -z "$HOSTNAME" ]; then
  107.   if [ -f /bin/hostname ] ; then HOSTNAME=`/bin/hostname`
  108.   elif [ -f /usr/bin/hostname ] ; then HOSTNAME=`/usr/bin/hostname`
  109.   # Solaris et al.
  110.   elif [ -f /usr/ucb/hostname ] ; then HOSTNAME=`/usr/ucb/hostname`
  111.   # Irix
  112.   elif [ -f /usr/bsd/hostname ] ; then HOSTNAME=`/usr/bsd/hostname`
  113.   fi
  114. fi
  115.  
  116. #if [ -n "$HOSTNAME" ]; then
  117. #  me="$me@$HOSTNAME"
  118. #fi
  119.  
  120. # now we have a valid $full_id.. use its full path
  121.  
  122. # lock the pr
  123. $PR_EDIT --lock $me $full_id 2> /tmp/user$$
  124. locked=t
  125.  
  126. if [ -s /tmp/user$$ ]; then
  127.   if [ "`grep exists /tmp/user$$`" = "" ]; then
  128.     echo "edit-pr: PR $full_id is locked by `sed 's/.*by //g' /tmp/user$$`"
  129.   else
  130.     echo "edit-pr: GNATS is presently locked, try again in a moment"
  131.   fi
  132.   rm -f /tmp/user$$
  133.   exit 1
  134. fi
  135.  
  136. state=`grep '^>State:' $pr | sed -e 's,^>State: ,,g' -e 's, ,,g'`
  137.  
  138. case $state in
  139.     [Cc]losed)    closed_state=t ;;
  140.     *)        closed_state="" ;;
  141. esac
  142.  
  143. if [ "$me" = "$GNATS_USER" -a "$closed_state" = "t" ]
  144. then    if [ 
  145.  
  146.  
  147. then    echon "Do you want to delete problem $full_id? [n]"
  148.     read answer junk < /dev/tty
  149.     case $answer in
  150.         [yY]*)    ;;
  151.         [qQ]*)    if [ "$locked" != "" ]; then
  152.                     $PR_EDIT --unlock $full_id
  153.                 locked=
  154.             fi
  155.             exit 0 ;;
  156.         *)    if [ "$locked" != "" ]; then
  157.                     $PR_EDIT --unlock $full_id
  158.                 locked=
  159.             fi
  160.             continue ;;
  161.     esac
  162. else    echo "To delete $full_id must be closed and you must be user $GNATS_USER"
  163.     if [ "$locked" != "" ]; then
  164.             $PR_EDIT --unlock $full_id
  165.         locked=
  166.     fi
  167.     exit 1
  168. fi
  169.  
  170. # take the relevant line out of the index - it should only be one
  171. cp $INDEX $INDEX.$$
  172. sed "\,^$full_id,d" $INDEX > $INDEX.$$
  173. index_lines=`wc -l $INDEX | awk '{ print $1} '`
  174. new_index_lines=`wc -l $INDEX.$$ | awk '{ print $1} '`
  175. diff=`expr $index_lines - $new_index_lines`
  176. if [ "$diff" -ne "1" ]
  177. then    echo "There should only be one match for $full_id in the index file, not $diff"
  178.     exit 1
  179. fi
  180.  
  181. # here's where we actually delete the file.
  182. rm $pr && mv $INDEX.$$ $INDEX
  183. echo "All references to $full_id now deleted"
  184.  
  185. mail_to="gnats-admin"
  186. if [ -n "$HOSTNAME" -a ! -z "$SHOW_HOST" ]; then
  187.   me="$me@$HOSTNAME"
  188.   tmp=""
  189.   for i in $mail_to
  190.   do
  191.     if [ 'echo $i | grep -s "@"' -eq "0" ]; then
  192.       if [ "$tmp" != "" ]; then
  193.     tmp="$tmp $i@$HOSTNAME"
  194.       else
  195.     tmp="$i@$HOSTNAME"
  196.       fi
  197.     fi
  198.   done
  199.   if [ "$tmp" != "" ]; then
  200.     mail_to=$tmp
  201.   fi
  202. fi
  203. $MAIL_AGENT $mail_to << __EOF__
  204. To: $mail_to
  205. From: $me
  206. Subject: Deleted PR $full_id
  207.  
  208. __EOF__
  209.  
  210. # call PR_EDIT on the new file and clean up
  211. $PR_EDIT --unlock $full_id
  212.  
  213. # end of loop
  214. done
  215.  
  216. exit 0
  217.